package com.ktjy.utils;

import java.util.ArrayList;
import java.util.List;

/**
 * @version v1.0
 * @Author JieGe
 * @Create 2024-12-19 - 10:01
 */
public class Page<T> { // 如果查询用户列表，T的值为SysUser，即T为数据类型
    private Integer pageNo = 1;  // 当前页码
    private Integer pageSize = 5; // 每页显示的数据行数
    private Integer totalCount;  // 总的记录数
    private Integer totalPageCount; // 总的页数
    private List<T> data;  // data用于保存分页查询到某信息列表。


    public Integer getPageNo() {
        return pageNo;
    }

    // 重写setPageNo 为当前页码赋值
    public void setPageNo(Integer pageNo) {
        if (pageNo < 0) {
            pageNo = 1;  // 如果当前页码小于0，默认赋值1
        }
        if (totalCount != null) {
            if (totalCount > 1 && pageNo > totalPageCount) {
                pageNo = totalPageCount;
            }
        }
        this.pageNo = pageNo;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public Integer getTotalCount() {
        return totalCount;
    }

    // 根据总的记录数和每页显示的数据行数计算总的页数
    public void setTotalCount(Integer totalCount) {
        this.totalCount = totalCount;
        // 51条。 每页10。 问：总多少页
        this.totalPageCount = this.totalCount % this.pageSize == 0 ? this.totalCount / this.pageSize : this.totalCount / this.pageSize + 1;
    }

    // 获取limit后的第一个参数，即起始位置偏移量
    public int offset() {
        return (pageNo - 1) * pageSize;  // 当前页码 - 1 * 每页显示的数据行数
    }
    // 判断是否是第一页
    public boolean isFirst() {
        return pageNo == 1;
    }
    // 判断是否是最后一页
    public boolean isLast() {
        return pageNo == totalPageCount;
    }
    // 判断是否还有下一页
    public boolean hasNext() {
        return pageNo < totalPageCount;
    }
    public boolean hasPrevious() {
        return pageNo > 1;
    }
    // 在页面上显示指定长度页码  showCount参数为指定的长度
    public List<Integer> getShowPageNos(int showCount) {
        // list中用于保存指定的页码数。 比如当前页码为1，要显示5个页数。  1、2、3、4、5
        List<Integer> list = new ArrayList<Integer>();
        list.add(pageNo);  // 先将当前页码添加到list集合中
        int step = 1; // 每次页面计算步长
        while (list.size() < showCount) {
            // list集合中保存的页码数 小于 指定长度, 还可以再循环
            boolean added = false;  // 用来记录是否添加完毕
            int left = pageNo - step;  // 左边减页码
            int right = pageNo + step;  // 右边加页码
            if (left > 1) {
                list.add(0, left);
                added = true; // true表示添加成功
            }
            if (right <= totalPageCount) {
                list.add(right);
                added = true;  // true表示添加成功
            }
            if (!added) {
                break;  // false表示添加失败
            }
            step++;  // 步长进行累加
        }
        return list;
    }

    public Integer getTotalPageCount() {
        return totalPageCount;
    }

    public void setTotalPageCount(Integer totalPageCount) {
        this.totalPageCount = totalPageCount;
    }

    public List<T> getData() {
        return data;
    }

    public void setData(List<T> data) {
        this.data = data;
    }
}
